<?php

require_once 'Conexao.php';

/**
 * Classe padrao Model
 * @author Jorge Hideki Hirata
 */
class Model 
{
    
    private $conexao;

    protected $nomeDaTabela;
    protected $primaryKey;

    public function __construct($nomeDaTabela, $primaryKey)
    {
    	$this->conexao = new Conexao();
    	$this->nomeDaTabela = $nomeDaTabela;
    	$this->primaryKey = $primaryKey;
    }

	/**
	 * Busca todos os dados da tabela
	 */
	public function fetchAll(array $parametros = array(), $useLike = FALSE,$toUpper = FALSE)
	{

		$query = "SELECT * FROM $this->nomeDaTabela ";
		
        if(!empty($parametros)){
			$query .= " WHERE ";
            foreach ($parametros as $parametro => $valor) {
				if ($valor != reset($parametros) && $valor != end($parametros)  || ($valor != reset($parametros) && count($parametros) == 2)){
					$query .= " AND ";
				}
                if ($useLike){
                    $query.= self::utilizarLike($parametro, $valor, $toUpper);
                }  

                if(!$useLike){
                    $query .= ($toUpper) ? " UPPER($parametro)" : " $parametro ";
                    $query .= " = ";

                    if (is_numeric($valor)) {
                        $query.= $valor;
                    } else {
                        $query.= ($toUpper) ? " UPPER($valor) " : " '$valor' ";
                    }
                }
			}
		}
        $resultado = $this->conexao->executaQuery($query);
		
		$resultadoFormatado = array();
		while($linha = $resultado->fetch_array(MYSQLI_ASSOC)){
			$resultadoFormatado[] = $linha;
		}
	
		return $resultadoFormatado;
    }
    /**
     * Insere ou altera um registro
     */
    public function save(array $parametros = array())
    {

    	$deveFazerUmUpdate = (in_array($this->primaryKey, array_keys($parametros)));

		$query = ($deveFazerUmUpdate) ? self::update($parametros) : self::inserir($parametros);
		$resultado = $this->conexao->executaQuery($query, !$deveFazerUmUpdate);
		
		return $resultado;
    }

    /**
     * Deleta um registro
     */
    public function delete($id)
    {
    	$query = "DELETE FROM $this->nomeDaTabela WHERE $this->primaryKey = '$id'";

    	return $this->conexaoQuery($query);
    }

    /* ------------------------------------------------------------------------------------------------------- */

    private function inserir(array $parametros = array())
    {
    	$query= "INSERT INTO $this->nomeDaTabela( ";

    	$query.= implode(', ', array_keys($parametros)).") VALUES('". implode("', '", array_values($parametros))."')";

    	return $query;
    }

    private function update(array $parametros = array())
    {
    	$query = "UPDATE $this->nomeDaTabela SET ";

    	$chavePrimaria = $parametros[$this->primaryKey];
    	unset($parametros[$this->primaryKey]);

    	foreach ($parametros as $coluna => $valor) {
    		$query .= " $coluna = ";
    		$query .= (is_numeric($valor)) ? $valor : " '$valor' ";

    		if($valor != end($parametros)) 
    			$query .= ", ";
    	}

    	$query .= " WHERE $this->primaryKey = $chavePrimaria";

    	return $query;
    }

    private function utilizarLike($coluna, array $parametro, $toUpper) {
        $query = "";
        foreach ($parametro as $valor) {
            if ($valor != reset($parametro) && $valor != end($parametro) || ($valor != reset($parametro) && count($parametro) == 2)){
                $query .= " OR ";
            }
            $query.= ($toUpper) ? " UPPER($coluna) " : " $coluna ";
            $query.= " LIKE ";
            $query.= ($toUpper) ? " UPPER('" : " '";
            $query.= "%$valor%') 
";
        }

        return $query;
    }
}

?>